home *** CD-ROM | disk | FTP | other *** search
/ Amiga Game-Power / Amiga Game-Power.iso / power games ii / galactic worm / corewars / anleitung / kapiteliii < prev    next >
Text File  |  1994-05-20  |  17KB  |  375 lines

  1.  
  2.                  K a p i t e l    3 :    T e c h n i k e n
  3.                  _________________________________________
  4.  
  5.  
  6.  
  7.  
  8. 3.1 Strategien
  9. ______________
  10.  
  11.  
  12.  
  13. Es gibt grundsätzlich zwei verschiedene Haltungen, die ein Kampfprogramm
  14. einnehmen kann: eine defensive und eine offensive.  Wie immer ist die
  15. Beschränkung auf nur eine dieser Strategien schlecht und fördert
  16. uninteressante Kämpfe, deren Ausgehen oft unentschieden ist oder stark
  17. vom Zufall der Positionierung der Programme im MARS-Speicher abhängt. 
  18.  
  19. Ein Beispiel zur defensiven Haltung ist "Mice", das sich zwar sehr
  20. schnell selbst kopiert und vermehrt, aber selten gewinnt.  Die rein
  21. offensive Haltung verkörpert "Gnom".  Dieses Programm bombardiert den
  22. gesamten MARS-Speicher im Abstand von fünf Zellen mit DAT 0 - Bomben. 
  23. "Gnom" selbst bleibt aber während des ganzen Kampfes an derselben Stelle
  24. und kümmert sich nicht um die aktivitäten das gegnerischen Programmes. 
  25. Der typische Ablauf einer Schlacht zwischen diesen Beispielen "Mice" und
  26. "Gnom" produziert ein Unentschieden, nachdem sich "Mice" bis auf 64
  27. Tasks (das von MARS zugelassene Maximum) vermehrt hat und "Gnom"
  28. vergebens versucht hat, die Abkömmlinge des Gegners zu löschen.  Oft
  29. ergeben sich auch Mutationen in Form von Knirpsen, wenn sich ein
  30. "Mice"-Programm in das laufende "Gnom" hineinkopiert und wenn in diesem
  31. Augenblick der Programmzeiger von "Gnom" auf die MOV-Anweisung des
  32. "mice"-Fragmentes zurückspringt. 
  33.  
  34. Die beiden Grundstrategien treten im Programm "Chang" vermischt auf,
  35. wenn auch das Gleichgewicht stark in defensiver Richtung verschoben ist. 
  36. Während "Chang" an seinem Ende einen Wurm aus Knirpsen produziert, die
  37. nach einigen hundert Zyklen bereits über 90 Prozent aller "Chang"-Tasks
  38. belegen, versucht ein einziger Programmzeiger verzweifelt, alle 16
  39. Zellen eine DAT 0 - Bombe zu legen.  Wenn - was wegen seiner Länge sehr
  40. wahrscheinlich ist - dieser aggressive Teil von "Chang" früher oder
  41. später vom Gegner zerstört ist, bleibt nur noch ein Unentschieden: Der
  42. endlose Knirps-Wurm ist kaum zu löschen. 
  43.  
  44. Zusammenfassend lässt sich sagen, dass sich ein gutes Kampfprogramm zu
  45. mehr oder weniger gleichen Teilen verteidigend und angreifend verhalten
  46. soll.  Ein Beispiel für ein solches Gleichgewicht ist "MausefalleII". 
  47. Es ist offensiv, weil es nach gegnerischen Tasks sucht, diese einfängt
  48. und schliesslich zerstört.  Es ist aber gleichzeitig defensiv, weil es
  49. an seinem unteren Ende ein wirksames Knirpsgrab unterhält, das von
  50. hinten anmarschierende Knirpse des Gegners manchmal (nicht immer!)
  51. abfangen kann. 
  52.  
  53.  
  54.  
  55.  
  56. 3.2 Weitere Beispielprogramme
  57. _____________________________
  58.  
  59.  
  60.  
  61. 3.2.1 Chang
  62. -----------
  63.  
  64.      trap      MOV #0
  65.      maketrap  JMP trap
  66.      ptr       DAT 9
  67.      start     SPL maketrap
  68.                SPL lnge
  69.                SUB #16, ptr
  70.                MOV #0, @ptr
  71.                JMP start
  72.      lnge      SPL 2
  73.                JMP lnge
  74.                MOV 0, 1
  75.  
  76.  
  77. "Chang" verhält sich sehr unfair: Es produziert an seinem Ende in einer
  78. Knirpsfabrik eine fast unbesiegbare Schlange von Knirpsen, die im
  79. Abstand von einer Zelle hinter sich herlaufen.  Ganz nebenbei befindet
  80. sich an seinem Beginn ein Knirpsgrab, das dort ankommende Kirpse
  81. abfangen soll.  Der mittlere Teil von "Chang" versucht, den Speicher im
  82. Abstand von 16 Zellen zu bombardieren.  Beim praktischen Experiment
  83. zeigt sich, dass die Knirpsfabrik schon nach kurzer Zeit soviele
  84. Programmzieger hervorgebracht hat, dass sich die Ausführung der anderen
  85. Teile von "Chang" bis ins Nutzlose verlangsamt.  
  86.  
  87. Trotzdem bietet "Chang" eine bemerkenswerte Technik: Die ersten beiden
  88. Anweisungen starten das Knirpsgrab und die Knirpsfabrik.  Auf diese
  89. Weise kann ein Programm an mehreren Stellen gleichzeitig ausgeführt
  90. werden.  Je nach deren Wichtigkeit zum Ueberleben des Kampfprogrammes
  91. können bestimmte Teile auch gleich von mehreren Zeigern hintereinander
  92. bearbeitet werden.  Denkbar wäre eine Verteilung von mehreren
  93. Programmzeigern auf das Knirpsgrab, weil sonst ein einzelner Knirps
  94. wegen seiner Geschwindigkeit zu leicht durch dessen Maschen schlüpfen
  95. könnte. 
  96.  
  97. "Chang" könnte stark verbessert werden, wenn an seinem Ende anstelle der
  98. endlosen Knirpsschlange nur ein kurzer Wurm von vielleicht drei bis fünf
  99. Knirpsen erzeugt würde.  So hätten die DAT-Bomben einen grösseren
  100. "Durchsatz", weil weniger Zeit durch unzählige Knirpse vergeudet würde.
  101.  
  102.  
  103. 3.2.2 Mice (Mäuse)
  104. ------------------
  105.  
  106.      ptr       DAT 0
  107.      start     MOV #7, ptr
  108.      loop      MOV @ptr, <5
  109.                DJN loop, ptr
  110.                SPL @3
  111.                ADD #653, 2
  112.                JMP start
  113.                DAT 833
  114.  
  115. Der phantasievolle Name dieses Programmes stammt von seiner ungehemmten
  116. Vermehrungswut.  "Mice" kopiert sich selber an eine 832 Zellen entfernte
  117. Stelle im Speicher und hüpft anschliessend in diese Kopie, um sich
  118. erneut zu vermehren.  Das erste Programm seinerseits beginnt mit einer
  119. neuen Kopie 1479 Zellen hinter der vorhergehenden - die Mäusefamilie ist
  120. geboren. 
  121.  
  122. Mit der ersten ausgeführten Zeile wird durch den MOV-Befehl ein Zähler
  123. für die Anzahl der Zeilen, die kopiert werden sollen, initialisiert. 
  124. Nun wird in einer Schleife mit nur zwei Anweisungen das ganze Programm
  125. kopiert.  Der Befehl "MOV @ptr, <5" nimmt zuerst die Speicherzelle, die
  126. durch den Zähler "ptr" bestimmt wird.  Dann wird durch "<5" die
  127. Anweisung "DAT 833" um eins vermindert.  Die Zieladresse ergibt sich aus
  128. dem neuen Ihnhalt der DAT-Anweisung: 832 Zeilen vom DAT-Befehl entfernt
  129. liegt die gesuchte Zelle.  Die durch "@ptr" gewonnene Programmzeile wird
  130. nun auf diese Zieladresse kopiert.  Der Befehl DJN sorgt dafür, dass
  131. genau 7 Zeilen bewegt werden.  Obwohl "Mice" eigentlich 8 Zeilen
  132. umfasst, muss die erste DAT 0 - Anweisung nicht mitkopiert werden, weil
  133. alle Speicherzellen vor einem Kampf gelöscht (mit DAT 0 gefüllt) werden.
  134.  
  135. Wenn alle Zeilen von "Mice" kopiert sind, wird mit dem SPL-Befehl das
  136. neue Programm gestartet.  Die Zeile mit der ADD-Anweisung dient zur
  137. erhöhung der Position des nächsten Abkömmlings: 833 - 7 + 653 = 1479
  138. Zellen hinter der Position des ursprünglichen Programmes.  Der Letzte
  139. Befehl von "Mice" beginnt den Zyklus erneut, indem wieder auf die erste
  140. Anweisung gesprungen wird. 
  141.  
  142.  
  143. 3.2.3 Mausefalle und MausefalleII
  144. ---------------------------------
  145.  
  146.      num       DAT 2660
  147.      falle     SPL *
  148.                JMP falle
  149.      anzahl    DAT 798
  150.      offset    DAT 0
  151.      grube     JMP -3
  152.      start     SUB #10, offset
  153.                ADD #10, grube
  154.                MOV grube, @offset
  155.                DJN start, anzahl
  156.      end       MOV #-4, anzahl
  157.      kill      MOV #0, @anzahl
  158.                SUB #3, anzahl
  159.                DJN kill, num
  160.                MOV #0, falle
  161.                MOV #2660, num
  162.                JMP end
  163.  
  164. Das Programm besteht aus einer Falle und zwei Hauptschleifen,
  165. gekennteichnet mit den Symbolen "start" und "kill".  In der ersten
  166. Schleife werden über den ganzen Speicher hinweg JMP-Befehle verteilt,
  167. die alle auf die Falle weisen.  Wenn einer der JMP-Befehle in ein
  168. gegnerisches Programm einschlägt und früher oder später ausgeführt wird,
  169. landet der betroffene Programmzeiger in der Falle: Ein SPL-Befehl, der
  170. auf sich selber weist und der durch den unmittelbar darauf folgenden
  171. Sprungbefehl immer wieder ausgeführt wird.  Einmal in der Falle
  172. gefangen, vermehrt sich dieser Programmzeiger immer wieder, bis
  173. schlisslich kein einziges fremdes Programm mehr frei ist: Die Ausführung
  174. der gegnerischen Programme kommt fast zum erliegen.  Die Schwierigkeit
  175. dieser Methode besteht in der Berechnung der Sprungweite der JMP-Bomben. 
  176. Durch den Befehl "ADD #10, grube" wird die Zahl 10 zum vorgegebenen
  177. Sprungbefehl "JMP -3" addiert.  Die Position der nächsten JMP-Bombe wird
  178. durch "SUB #10, offset" bestimmt: Zehn Zellen hinter der zuletzt
  179. gesetzten MP-Anweisung.  Mit "MOV grube @offset" wird durch die
  180. indirekte Adressierung der Inbhlt von "grube" (JMP) an die durch
  181. "offset" bestimmte Speicherzelle kopiert - eine weitere Fallgrube ist
  182. erstellt.  Der Abschluss der Schleife bildet der DJN-Befehl, der den
  183. ganzen Vorgang 1660 mal wiederholen lässt. 
  184.  
  185. Die zweite Schleife ist etwas einfacher: Jede dritte Zelle des Speichers
  186. wird mit Hilfe einer DAT 0 - Anweisung gelöscht.  So sollte auch den
  187. letzten verirrten gegnerischen Programmen der Garaus gemacht werden. 
  188. Wenn die Schleife beendet ist (nach 2660 Ausführungen) werden durch den
  189. Befehl "MOV #0, falle" alle Programme, die sich in der Falle befinden,
  190. mit einem Schlag gelöscht.  Wenn jetzt noch kein Sieg erfolgt ist,
  191. besteht immerhin noch die Gelegenheit eines Unentschiedens: Mit der
  192. letzten JMP-Anweisung des Programmes wird die zweite Schleife nochmals
  193. von Vorne begonnen. 
  194.  
  195. Das Programm "MausefalleII" (es ist nicht hier abgedruckt, siehe
  196. Programmdiskette im Verzeichnis 'Beispiele') besitzt an seinem Anfang
  197. ein Knirpsgrab, wie es schon im ersten Kapitel vorgestellt wurde.  Das
  198. Grab wird durch die erste SPL-Anweisung nach dem Start aktiviert. 
  199. "Mausefalle" ist zwar ewas schneller als "MausefalleII", aber gegen
  200. einen Knirps kann sie höchstens ein Unentschieden herausholen.  Im
  201. Gegensatz dazu gewinnt "MausefalleII" gegen "Mice" viel seltener, weil
  202. die Bombardierungsgeschwindigkeit schon zu langsam ist.
  203.  
  204. Hier noch die Statistik einer Serie von 30 Zweikämpfen zwischen
  205. "Mausefalle" und "Mice": 70% aller Kämpfe wurden von "Mausefalle"
  206. gewonnen, 20% gingen auf das Konto von "Mice" und 10% der
  207. Auseinandersetzungen verliefen unentschieden.  Allerdings wurde für
  208. diese Werte die Anzahl der Zyklen von 10000 (Standard) auf 20000 erhöht. 
  209. Vorsicht: "Mausefalle" ist mit nur 10000 Zyklen nicht lauffähig, weil
  210. die zweite Schleife nicht zu Ende geführt werden kann.  Dieser Mangel
  211. lässt sich aber korrigieren, wenn die Schrittweite der JMP- und
  212. DAT-Bomben etwas vermindert wird. 
  213.  
  214.  
  215.  
  216. 3.3 Die interne Darstellung eines Redcode Programmes
  217. ----------------------------------------------------
  218.  
  219. Das Entstehen eines Kampfprogrammes erstreckt sich über zwei Stufen: Das
  220. Schreiben des Quelltextes mit dem Editor und das anschliessende
  221. übersetzen dieses Textes durch den Assembler.  Doch wie sieht eigentlich
  222. das Programm nach der Assemblierung aus? Und wie wird das 8000 Zellen
  223. umfassende MARS-Speicherfeld im Computer abgelegt? Diese beiden Fragen
  224. sollen nun beantwortet werden.  Vergessen Sie aber nicht, dass es für
  225. das Schreiben eines Kampfprogrammes unwichtig ist, ob Sie über die
  226. interne Verwaltung von MARS bescheid wissen oder nicht.  Dieser letzte
  227. Abschnitt ist vor Allem zur Information von Core Wars - Freaks gedacht,
  228. die den Amiga auch selber programmieren.  Wenn es Sie (noch) nicht
  229. interessieren sollte, können Sie die Lektüre der Anleitung an dieser
  230. Stelle beenden. 
  231.  
  232.  
  233. 3.3.1 Redcode entschlüsselt
  234. ---------------------------
  235.  
  236. Die Ausgabe eines "richtigen" Assemblers besteht in Codes, die von der
  237. CPU des dazugehörenden Computers als Befehle erkannt und ausgeführt
  238. werden.  Weil aber die Redcode-Anweisungen von keinem existierenden
  239. Mikroprozessor verstanden werden können, muss eine imaginäre Redcode-CPU
  240. softwaremässig simuliert werden, was auf dem Amiga durch das Core Wars -
  241. Programm geschieht. 
  242.  
  243. Der Assembler von MARS übersetzt jeden Redcode-Befehl und seine
  244. Argumente in eine sieben Bytes lange Folge von einzelnen Daten.  Eine
  245. Folge von Daten, deren Anordnung einem im Voraus bestimmten Muster
  246. entspricht, nennt man Datenstruktur.  Diese Struktur, die jeweils eine
  247. komplette Redcode-Anweisung enthält, ist in den einzelnen Bytes
  248. folgendermassen aufgebaut:
  249.  
  250.  
  251. Name      Länge     Bedeutung
  252. _________________________________________________________________
  253.  
  254. Befehl    1 Byte    Zahlencode des Redcode-Befehls. Der Wert
  255.                     kann 0 bis 8 oder 10 sein, je nach Anweisung 
  256.                     (Tabelle am Ende dieses Kapitels).
  257. Modus A   1 Byte    Adressierungsart des ersten Argumentes,
  258.                     kann einen Wert von 0 bis 3 für unmittelbar, 
  259.                     direkt, indirekt und indirekt-inkrement annehmen.
  260. Wert A    2 Bytes   Der reine Zahlenwert des ersten Argumentes. Er 
  261.                     muss immer zwischen -7999 und 7999 liegen.
  262. Modus B   1 Byte    Adressierungsart des zweiten Argumentes.
  263. Wert B    2 Bytes   Zahlenwert des zweiten Argumentes.
  264. _________________________________________________________________
  265.  
  266. Total     7 Bytes
  267. =================
  268.  
  269.  
  270. Ein Programm, das vom Assembler übersetzt wurde, besteht also nicht mehr
  271. aus lesbarem Text, sondern aus einer Folge von solchen Datenstrukturen. 
  272. Die Argumente eines Befehles setzen sich aus je einem Modus/Wert Paar
  273. zusammen.  Modus A und Wert A ergeben somit im Verein das Argument A,
  274. für Argument B gilt dasselbe in grün. 
  275.  
  276. Die Werte A und B dürfen Zahlen von -7999 bis +7999 beinhalten. 
  277. Eigentlich ist dies schon doppelt soviel als nötig ist, weil der
  278. MARS-Speicher nur 8000 Zellen (0 bis 7999) umfasst.  Der Grund dafür ist
  279. die Lesbarkeit eines schon assemblierten Programmes:
  280.  
  281. Ein Sprung um 7992 Adressen nach vorne wird verständlicher, wenn man
  282. negative Zahlen für Rückwärtssprünge verwendet.  Der Befehl lautet dann:
  283. Springe um 8 Adressen zurück. 
  284.  
  285.  
  286. 3.3.2 MARS-Speicher im Amiga
  287. ----------------------------
  288.  
  289. Vielleicht haben Sie nun schon eine Vorahnung, wie das MARS-Speicherfeld
  290. im Computer angelegt ist: Die 8000 Adressen von MARS bestehen aus einer
  291. Liste mit 8000 der oben beschriebenen Befehlsstrukturen.  Beim Starten
  292. eines Spiels werden zuerst alle Elemente der Liste gelöscht (es wird mit
  293. anderen Worten in jede der Strukturen eine DAT 0 - Anweisung
  294. geschrieben) und die beiden Kampfprogramme werden an zufälligen
  295. Startplätzen eingelesen.  Der Zugriff auf die einzelnen Zellen erfolgt
  296. durch ihre Nummern: Jede Zahl, die eine Adresse im Speicherfeld
  297. darstellt, wird mit Hilfe einer Modulo-Operation (Division mit
  298. Ermittlung des Restes) wenn nötig auf einen Wert zwischen 0 und 7999
  299. inklusive verkleinert.  Das Ergebnis ist dann die Nummer der
  300. betreffenden Speicherzelle.
  301.  
  302.  
  303. 3.3.3 Grenzen dieser Darstellung
  304. --------------------------------
  305.  
  306. Wir haben die Grösse von 7 Bytes einer Redcode-Anweisung deshalb
  307. gewählt, weil sie uns als guter Kompromiss zwischen Länge,
  308. Geschwindigkeit und Erweiterbarkeit erscheint.  Die Möglichkeit der
  309. Erweiterung wird klarer, wenn Sie sich die theoretisch darstellbaren
  310. Werte von Befehl, Modus und Wert vor Augen führen:
  311.  
  312. Befehl = 1 Byte =  8 Bit = 2 hoch  8 =   256 verschiedene Zustände
  313. Modus  = 1 Byte =  8 Bit = 2 hoch  8 =   256 verschiedene Zustände
  314. Wert   = 2 Byte = 16 Bit = 2 hoch 16 = 65536 verschiedene Zustände
  315.  
  316. Demnach könnten noch 246 weitere Redcode-Befehle und 252 neue
  317. Adressierungsarten eingeführt und das MARS-Speicherfeld um 57536 Zellen
  318. erweitert werden.  Die Geschwindigkeit war das wichtigste Kriterium: Der
  319. Prozessor des Amiga besitzt Befehle, die unter anderem auch mit 16-Bit
  320. Werten sehr schnell hantieren können.  Der reine Informationsgehalt
  321. einer Redcode-Anweisung liesse sich in insgesamt 34 Bits darstellen.  Um
  322. jedoch diese Bits bei jedem Zugriff auf einen Befehl und seine Argumente
  323. auseinanderzupflücken, ginge viel zuviel Zeit verloren - ein Kampf
  324. zwischen zwei Programmen würde sich unnötig in die Länge ziehen. 
  325.  
  326. Kommen wir zum dritten Punkt, der Länge einer MARS- Speicherzelle.  Der
  327. insgesamt von MARS benötigte Speicherplatz im RAM des Computers beträgt
  328. im besten Falle 8000 mal 7, also 56000 Bytes (= 56 KBytes).  Wenn wir
  329. dieselbe Rechnung mit der vorhin erwähnten 34-Bit Notation durchführen,
  330. kommen wir auf einen Verbrauch von 34000 Bytes.  Auf einem Computer mit
  331. 512 KByte RAM in der Grundausstattung erschien es uns vorteilhafter,
  332. zugunsten der Kampfgeschwindigkeit auf die vergebenen 20 KByte zu ver-
  333. zichten. 
  334.  
  335.  
  336. 3.3.4 Tabelle der Befehlscodes
  337. ------------------------------
  338.  
  339. Hier folgt eine Tabelle aller Redcode-Befehle mit den dazugehörenden
  340. Befehlscodes und den erlaubten Adressierungmodi.  Die Zeichen, die nach
  341. den Kennbuchstaben A und B stehen, stellen die erlaubten
  342. Adressierungsarten dar.  Wenn Sie sich ein bereits assembliertes
  343. Programm anschauen, können Sie die dort auftretenden Codes mit Hilfe der
  344. Tabelle entschlüsseln.  Anstelle der Zeichen #, $, @ und < stehen im
  345. lauffähigen Programm die Zahlen 0, 1, 2 und 3. 
  346.  
  347.  
  348. Befehl    Arg. A    Arg. B    Code      Bedeutung
  349. _________________________________________________________________
  350.  
  351. DAT       -         B:  $       0       Daten
  352. MOV       A: #$@<   B:  $@<     1       Uebertragen
  353. ADD       A: #$@<   B:  $@<     2       Addieren
  354. SUB       A: #$@<   B:  $@<     3       Subtrahieren
  355. JMP       A:  $@<   -           4       Springen
  356. JMZ       A:  $@<   B: #$@<     5       Springen, wenn Null
  357. JMN       A:  $@<   B: #$@<     6       Springen, wenn nicht Null
  358. DJN       A:  $@<   B: #$@<     7       Vermindern und Springen
  359. CMP       A: #$@<   B: #$@<     8       Vergleiche
  360. SPL       -         B:  $@<    10       Spalte auf
  361.  
  362.  
  363.  
  364. 3.3.4 Das War's
  365. ---------------
  366.  
  367. Sie haben sich hiermit bis zum Ende der Anleitung durchgeackert und
  368. können nun mit Recht von sich behaupten, ein Redcode Programmierer zu
  369. sein.  Wir hoffen, dass es Ihnen Spass gemacht hat und es noch machen
  370. wird, sich mit diesem neuen Spielprinzip auseinanderzusetzen.
  371.  
  372. Der Rest der Anleitung besteht aus den zwei Anhängen, die verschiedene
  373. Informationen zu Core Wars, ein Stichwortverzeichnis und ein kleines
  374. Begriffsverzeichnis enthalten.
  375.